package utils

import (
    "authserver/global"
    "bytes"
    "context"
    "fmt"
    "github.com/qiniu/go-sdk/v7/auth/qbox"
    "github.com/qiniu/go-sdk/v7/storage"
    "github.com/qiniu/go-sdk/v7/storagev2/credentials"
    "github.com/qiniu/go-sdk/v7/storagev2/uptoken"
    "io"
    "mime/multipart"
    "time"
)

// 接收两个参数 一个文件流 一个 bucket 你的七牛云标准空间的名字
func Upload(file *multipart.FileHeader) (err error, path string, key string) {
	putPolicy := storage.PutPolicy{
		Scope: global.GVA_CONFIG.Qiniu.Bucket,
	}
	mac := qbox.NewMac(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)
	upToken := putPolicy.UploadToken(mac)
	cfg := storage.Config{}
	// 空间对应的机房
	cfg.Zone = &storage.ZoneHuadong
	// 是否使用https域名
	cfg.UseHTTPS = false
	// 上传是否使用CDN上传加速
	cfg.UseCdnDomains = false
	formUploader := storage.NewFormUploader(&cfg)
	ret := storage.PutRet{}
	putExtra := storage.PutExtra{
		Params: map[string]string{
			"x:name": "github logo",
		},
	}
	f, e := file.Open()
	if e != nil {
		fmt.Println(e)
		return e, "", ""
	}
	dataLen := file.Size
	fileKey := fmt.Sprintf("%d%s", time.Now().Unix(), file.Filename) // 文件名格式 自己可以改 建议保证唯一性
	err = formUploader.Put(context.Background(), &ret, upToken, fileKey, f, dataLen, &putExtra)
	if err != nil {
		global.GVA_LOG.Error("upload file fail:", err)
		return err, "", ""
	}
	return err, global.GVA_CONFIG.Qiniu.ImgPath + "/" + ret.Key, ret.Key
}

// 接收两个参数 一个byte数组 一个 bucket 你的七牛云标准空间的名字
func UploadBytes(data []byte, filename string) (err error, path string, key string) {
	putPolicy := storage.PutPolicy{
		Scope: global.GVA_CONFIG.Qiniu.Bucket,
	}
	mac := qbox.NewMac(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)
	upToken := putPolicy.UploadToken(mac)
	cfg := storage.Config{}
	// 空间对应的机房
	cfg.Zone = &storage.ZoneHuadong
	// 是否使用https域名
	cfg.UseHTTPS = false
	// 上传是否使用CDN上传加速
	cfg.UseCdnDomains = false
	formUploader := storage.NewFormUploader(&cfg)
	ret := storage.PutRet{}
	putExtra := storage.PutExtra{
		Params: map[string]string{
			"x:name": "github logo",
		},
	}
	dataLen := int64(len(data))
	fileKey := fmt.Sprintf("%d%s", time.Now().Unix(), filename) // 文件名格式 自己可以改 建议保证唯一性
	fileKey = "erpFile/" + fileKey
	err = formUploader.Put(context.Background(), &ret, upToken, fileKey, bytes.NewReader(data), dataLen, &putExtra)
	if err != nil {
		global.GVA_LOG.Error("upload file fail:", err)
		return err, "", ""
	}
	return err, global.GVA_CONFIG.Qiniu.ImgPath + "/" + ret.Key, ret.Key
}

// 接收两个参数 一个byte数组 一个 bucket 你的七牛云标准空间的名字
func UploadBytesNotFormatKey(data []byte, filename string) (err error, path string, key string) {
	putPolicy := storage.PutPolicy{
		Scope: global.GVA_CONFIG.Qiniu.Bucket,
	}
	mac := qbox.NewMac(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)
	upToken := putPolicy.UploadToken(mac)
	cfg := storage.Config{}
	// 空间对应的机房
	cfg.Zone = &storage.ZoneHuadong
	// 是否使用https域名
	cfg.UseHTTPS = false
	// 上传是否使用CDN上传加速
	cfg.UseCdnDomains = false
	formUploader := storage.NewFormUploader(&cfg)
	ret := storage.PutRet{}
	putExtra := storage.PutExtra{
		Params: map[string]string{
			"x:name": "github logo",
		},
	}
	dataLen := int64(len(data))
	fileKey := filename // 文件名格式 自己可以改 建议保证唯一性
	fileKey = "erpFile/" + fileKey
	err = formUploader.Put(context.Background(), &ret, upToken, fileKey, bytes.NewReader(data), dataLen, &putExtra)
	if err != nil {
		global.GVA_LOG.Error("upload file fail:", err)
		return err, "", ""
	}
	return err, global.GVA_CONFIG.Qiniu.ImgPath + "/" + ret.Key, ret.Key
}

func DeleteFile(key string) error {

	mac := qbox.NewMac(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)
	cfg := storage.Config{
		// 是否使用https域名进行资源管理
		UseHTTPS: false,
	}
	// 指定空间所在的区域，如果不指定将自动探测
	// 如果没有特殊需求，默认不需要指定
	// cfg.Zone=&storage.ZoneHuabei
	bucketManager := storage.NewBucketManager(mac, &cfg)
	err := bucketManager.Delete(global.GVA_CONFIG.Qiniu.Bucket, key)
	if err != nil {
		fmt.Println(err)
		return err
	}
	return nil
}

func UploadNotKey(file *multipart.FileHeader) (err error, path string, key string) {
	putPolicy := storage.PutPolicy{
		Scope: global.GVA_CONFIG.Qiniu.Bucket,
	}
	mac := qbox.NewMac(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)
	upToken := putPolicy.UploadToken(mac)
	cfg := storage.Config{}
	// 空间对应的机房
	cfg.Zone = &storage.ZoneHuadong
	// 是否使用https域名
	cfg.UseHTTPS = false
	// 上传是否使用CDN上传加速
	cfg.UseCdnDomains = false
	formUploader := storage.NewFormUploader(&cfg)
	ret := storage.PutRet{}
	putExtra := storage.PutExtra{
		Params: map[string]string{
			"x:name": "github logo",
		},
	}
	f, e := file.Open()
	if e != nil {
		fmt.Println(e)
		return e, "", ""
	}
	dataLen := file.Size
	//fileKey := fmt.Sprintf("%d%s", time.Now().Unix(), file.Filename) // 文件名格式 自己可以改 建议保证唯一性
	fileKey := "goodsImage/" + file.Filename
	err = formUploader.Put(context.Background(), &ret, upToken, fileKey, f, dataLen, &putExtra)
	if err != nil {
		global.GVA_LOG.Error("upload file fail:", err)
		return err, "", ""
	}
	return err, global.GVA_CONFIG.Qiniu.ImgPath + "/" + ret.Key, ret.Key
}

// 接收两个参数 一个文件流 一个 bucket 你的七牛云标准空间的名字
func UploadWithName(file io.Reader, dataLen int64, pathname string) (err error, path string, key string) {
	putPolicy := storage.PutPolicy{
		Scope: global.GVA_CONFIG.Qiniu.Bucket,
	}
	mac := qbox.NewMac(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)
	upToken := putPolicy.UploadToken(mac)
	cfg := storage.Config{}
	// 空间对应的机房
	cfg.Zone = &storage.ZoneHuadong
	// 是否使用https域名
	cfg.UseHTTPS = false
	// 上传是否使用CDN上传加速
	cfg.UseCdnDomains = false
	formUploader := storage.NewFormUploader(&cfg)
	ret := storage.PutRet{}
	putExtra := storage.PutExtra{
		Params: map[string]string{
			"x:name": "github logo",
		},
	}

	err = formUploader.Put(context.Background(), &ret, upToken, pathname, file, dataLen, &putExtra)
	if err != nil {
		global.GVA_LOG.Error("upload file fail:", err)
		return err, "", ""
	}
	return err, global.GVA_CONFIG.Qiniu.ImgPath + "/" + ret.Key, ret.Key
}

// @Title 更新七牛文件有效期
// @Description 函数的详细描述
// @Author 赵伟 2023/12/1 15:18
// @Param
// @Return

func DeleteAfterDays(key string, days int) (err error) {
    mac := qbox.NewMac(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)
    cfg := storage.Config{}

    bucketManager := storage.NewBucketManager(mac, &cfg)

    err = bucketManager.DeleteAfterDays(global.GVA_CONFIG.Qiniu.Bucket, key, days)

    return err
}

// @Title 获取文件列表
// @Description 函数的详细描述
// @Author 赵伟 2023/12/1 15:27
// @Param   delimiter       文件夹
// @Param   prefix          文件前缀
// @Param   market          列举位置，默认空字符串
// @Param   limit           最大返回列举数，默认1000，最大1000
// @Return

func GetFilesList(delimiter, prefix, market string, limit int) (entries []storage.ListItem, commonPrefixes []string, nextMarker string, hasNext bool, err error) {
    mac := qbox.NewMac(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)
    cfg := storage.Config{}

    bucketManager := storage.NewBucketManager(mac, &cfg)

    if limit <= 0 || limit > 1000 {
        limit = 1000
    }

    entries, commonPrefixes, nextMarker, hasNext, err = bucketManager.ListFiles(global.GVA_CONFIG.Qiniu.Bucket, prefix, delimiter, market, limit)

    return
}

// @Title 获取上传token
// @Description 函数的详细描述
// @Author 赵伟 2022/9/7 16:20
// @Param
// @Return

func GetUploadToken() (upToken string) {

    mac := credentials.NewCredentials(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)
    bucket := global.GVA_CONFIG.Qiniu.Bucket
    putPolicy, err := uptoken.NewPutPolicy(bucket, time.Now().Add(1 * time.Hour))
    if err != nil {
        return ""
    }
    upToken, err= uptoken.NewSigner(putPolicy, mac).GetUpToken(context.Background())
    if err != nil {
        return ""
    }
	return upToken
}
